#include <vector>
using namespace std;
#include <set>
#include <algorithm>


// version 1 
class Solution {
public:
    int findMin(vector<int>& nums) {
        int n = nums.size() - 1;
/*         bool isrotate = (nums[0] > nums[n]) ? true : false;    
        if(isrotate == false) return nums[0]; */


        //判断完数组是否有旋转变化后，就可以直到，数组一定是被分为两个有序区间的！
        //而且，以最后一个数字为参考：
        //前面一段升序区间的值 > 最后一个数字
        //后面一段都要 < 这个数字！

        int left = 0, right = n;
        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] > nums[n]) left = mid + 1;
            else right = mid;
        }
        return nums[left];
    }
};


//错误示例
class Solution {
public:
//以第一个数作为参照物 ->这里会出现一个问题，就是如果数组是严格升序的时候，会把答案跳过去！
//参照最后一个数来分两段是默认了大数组在右边的！ 
//但是如果说以第一个作为参照，如果发现当前的值大于，说明最小值在右边。但是右边不一定有啊！
    int findMin(vector<int>& nums) {
        int n = nums.size() - 1;

        //面对严格升序的情况
        bool isrotate = (nums[0] > nums[n]) ? true : false;    
        if(isrotate == false) return nums[0];

        int left = 0, right = n;
        while(left < right){
            //但是，这里有一个特例[2，1]，无论中点偏左还是偏右，都无法做对！
            int mid = left + (right - left) / 2;
            if(nums[mid] > nums[0]) left = mid + 1;
            else right = mid;
        }
        return nums[left];
    }
};